<!DOCTYPE html>
<html lang="en" dir="ltr" class="client-nojs">
<head>
<title>Enumeration declaration - cppreference.com</title>
<meta charset="UTF-8">
<meta name="generator" content="MediaWiki 1.21.2">
<link rel="shortcut icon" href="../../../common/favicon.ico">
<link rel="stylesheet" href="../../../common/ext.css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" href="../../../common/site_modules.css">
<style>a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),a:lang(ur){text-decoration:none}#toc{display:none}.editsection{display:none}
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-css:7:472787eddcf4605d11de8c7ef047234f */</style>

<script src="../../../common/startup_scripts.js"></script>
<script>if(window.mw){
mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"cpp/language/enum","wgTitle":"cpp/language/enum","wgCurRevisionId":140599,"wgArticleId":4564,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"cpp/language/enum","wgRestrictionEdit":[],"wgRestrictionMove":[]});
}</script><script>if(window.mw){
mw.loader.implement("user.options",function(){mw.user.options.set({"ccmeonemails":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"editfont":"default","editondblclick":0,"editsection":0,"editsectiononrightclick":0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatchlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig":0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"imagesize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocache":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":0,"previewonfirst":0,"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching":1,"showtoc":0,"showtoolbar":1,"skin":"cppreference2","stubthreshold":0,"thumbsize":2,"underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0,"watchdeletion":0,
"watchlistdays":3,"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthideminor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchNs2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":false,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"searchNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs15":false,"gadget-ColiruCompiler":1,"gadget-MathJax":1});;},{},{});mw.loader.implement("user.tokens",function(){mw.user.tokens.set({"editToken":"+\\","patrolToken":false,"watchToken":false});;},{},{});
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-js:7:9f05c6caceb9bb1a482b6cebd4c5a330 */
}</script>
<script>if(window.mw){
mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.legacy.ajax"]);
}</script>
<style type="text/css">/*<![CDATA[*/
.source-cpp {line-height: normal;}
.source-cpp li, .source-cpp pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for cpp
 * CSS class: source-cpp, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.cpp.source-cpp .de1, .cpp.source-cpp .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.cpp.source-cpp  {font-family:monospace;}
.cpp.source-cpp .imp {font-weight: bold; color: red;}
.cpp.source-cpp li, .cpp.source-cpp .li1 {font-weight: normal; vertical-align:top;}
.cpp.source-cpp .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.cpp.source-cpp .li2 {font-weight: bold; vertical-align:top;}
.cpp.source-cpp .kw1 {color: #0000dd;}
.cpp.source-cpp .kw2 {color: #0000ff;}
.cpp.source-cpp .kw3 {color: #0000dd;}
.cpp.source-cpp .kw4 {color: #0000ff;}
.cpp.source-cpp .co1 {color: #909090;}
.cpp.source-cpp .co2 {color: #339900;}
.cpp.source-cpp .coMULTI {color: #ff0000; font-style: italic;}
.cpp.source-cpp .es0 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es1 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es2 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es3 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es4 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es5 {color: #008000; font-weight: bold;}
.cpp.source-cpp .br0 {color: #008000;}
.cpp.source-cpp .sy0 {color: #008000;}
.cpp.source-cpp .sy1 {color: #000080;}
.cpp.source-cpp .sy2 {color: #000040;}
.cpp.source-cpp .sy3 {color: #000040;}
.cpp.source-cpp .sy4 {color: #008080;}
.cpp.source-cpp .st0 {color: #008000;}
.cpp.source-cpp .nu0 {color: #000080;}
.cpp.source-cpp .nu6 {color: #000080;}
.cpp.source-cpp .nu8 {color: #000080;}
.cpp.source-cpp .nu12 {color: #000080;}
.cpp.source-cpp .nu16 {color:#000080;}
.cpp.source-cpp .nu17 {color:#000080;}
.cpp.source-cpp .nu18 {color:#000080;}
.cpp.source-cpp .nu19 {color:#000080;}
.cpp.source-cpp .ln-xtra, .cpp.source-cpp li.ln-xtra, .cpp.source-cpp div.ln-xtra {background-color: #ffc;}
.cpp.source-cpp span.xtra { display:block; }

/*]]>*/
</style><style type="text/css">/*<![CDATA[*/
.source-text {line-height: normal;}
.source-text li, .source-text pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for text
 * CSS class: source-text, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.text.source-text .de1, .text.source-text .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.text.source-text  {font-family:monospace;}
.text.source-text .imp {font-weight: bold; color: red;}
.text.source-text li, .text.source-text .li1 {font-weight: normal; vertical-align:top;}
.text.source-text .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.text.source-text .li2 {font-weight: bold; vertical-align:top;}
.text.source-text .ln-xtra, .text.source-text li.ln-xtra, .text.source-text div.ln-xtra {background-color: #ffc;}
.text.source-text span.xtra { display:block; }

/*]]>*/
</style><!--[if lt IE 7]><style type="text/css">body{behavior:url("/mwiki/skins/cppreference2/csshover.min.htc")}</style><![endif]--></head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_enum skin-cppreference2 action-view cpp-navbar">
        <!-- header -->
        <!-- /header -->
        <!-- content -->
<div id="cpp-content-base">
            <div id="content">
                <a id="top"></a>
                <div id="mw-js-message" style="display:none;"></div>
                                <!-- firstHeading -->
<h1 id="firstHeading" class="firstHeading">Enumeration declaration</h1>
                <!-- /firstHeading -->
                <!-- bodyContent -->
                <div id="bodyContent">
                                        <!-- tagline -->
                    <div id="siteSub">From cppreference.com</div>
                    <!-- /tagline -->
                                        <!-- subtitle -->
                    <div id="contentSub"><span class="subpages">&lt; <a href="../../cpp.html" title="cpp">cpp</a>‎ | <a href="../language.html" title="cpp/language">language</a></span></div>
                    <!-- /subtitle -->
                                                            <!-- bodycontent -->
                    <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class="t-navbar" style=""><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../../cpp.html" title="cpp"> C++</a><div class="t-navbar-menu"><div><div><table class="t-nv-begin" cellpadding="0" style="line-height:1.1em;">
<tr class="t-nv"><td colspan="5"> <a href="../compiler_support.html" title="cpp/compiler support"> Compiler support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../freestanding.html" title="cpp/freestanding"> Freestanding and hosted</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../language.html" title="cpp/language"> Language</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../header.html" title="cpp/header"> Standard library headers</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../named_req.html" title="cpp/named req"> Named requirements </a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../feature_test.html" title="cpp/feature test"> Feature test macros </a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../utility.html#Language_support" title="cpp/utility"> Language support library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../concepts.html" title="cpp/concepts"> Concepts library</a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../meta.html" title="cpp/meta"> Metaprogramming library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../error.html" title="cpp/error"> Diagnostics library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../utility.html" title="cpp/utility"> General utilities library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../string.html" title="cpp/string"> Strings library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../container.html" title="cpp/container"> Containers library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../iterator.html" title="cpp/iterator"> Iterators library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../ranges.html" title="cpp/ranges"> Ranges library</a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../algorithm.html" title="cpp/algorithm"> Algorithms library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../numeric.html" title="cpp/numeric"> Numerics library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../locale.html" title="cpp/locale"> Localizations library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../io.html" title="cpp/io"> Input/output library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../filesystem.html" title="cpp/filesystem"> Filesystem library</a> <span class="t-mark-rev t-since-cxx17">(C++17)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../regex.html" title="cpp/regex"> Regular expressions library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../thread.html" title="cpp/thread"> Concurrency support library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../experimental.html" title="cpp/experimental"> Technical specifications</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../symbol_index.html" title="cpp/symbol index"> Symbols index</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../links/libs.html" title="cpp/links/libs"> External libraries</a> </td></tr>
</table></div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../language.html" title="cpp/language"> C++ language</a><div class="t-navbar-menu"><div><div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h1"><td colspan="5"> General topics</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="../preprocessor.html" title="cpp/preprocessor"> Preprocessor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../comments.html" title="cpp/comment"> Comments</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="../keywords.html" title="cpp/keyword"> Keywords</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="escape.html" title="cpp/language/escape"> Escape sequences</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="statements.html" title="cpp/language/statements"> Flow control</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Conditional execution statements</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="if.html" title="cpp/language/if"><tt>if</tt></a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="switch.html" title="cpp/language/switch"><tt>switch</tt></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Iteration statements (loops)</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="for.html" title="cpp/language/for"><tt>for</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="range-for.html" title="cpp/language/range-for"> range-<code>for</code></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="while.html" title="cpp/language/while"><tt>while</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="do.html" title="cpp/language/do"> <code>do-while</code></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Jump statements </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="continue.html" title="cpp/language/continue"><tt>continue</tt></a> - <a href="break.html" title="cpp/language/break"><tt>break</tt></a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="goto.html" title="cpp/language/goto"><tt>goto</tt></a> - <a href="return.html" title="cpp/language/return"><tt>return</tt></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="functions.html" title="cpp/language/functions"> Functions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function.html" title="cpp/language/function"> Function declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="lambda.html" title="cpp/language/lambda"> Lambda function expression</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="inline.html" title="cpp/language/inline"> <code>inline</code> specifier</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="except_spec.html" title="cpp/language/except spec"> Dynamic exception specifications</a> <span class="t-mark-rev t-until-cxx20">(until C++20)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="noexcept_spec.html" title="cpp/language/noexcept spec"> <code>noexcept</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Exceptions</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="throw.html" title="cpp/language/throw"> <code>throw</code>-expression</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="try_catch.html" title="cpp/language/try catch"> <code>try</code>-<code>catch</code> block</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Namespaces</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="namespace.html" title="cpp/language/namespace"> Namespace declaration</a>  </td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="namespace_alias.html" title="cpp/language/namespace alias"> Namespace aliases</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Types</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="types.html" title="cpp/language/types"> Fundamental types</a></td></tr>
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> Enumeration types</strong></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function.html" title="cpp/language/function"> Function types</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class.html" title="cpp/language/class"> Class/struct types</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="union.html" title="cpp/language/union"> Union types</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Specifiers</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="decltype.html" title="cpp/language/decltype"><tt>decltype</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="auto.html" title="cpp/language/auto"><tt>auto</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="alignas.html" title="cpp/language/alignas"><tt>alignas</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="cv.html" title="cpp/language/cv"> <code>const</code>/<code>volatile</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="constexpr.html" title="cpp/language/constexpr"><tt>constexpr</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="storage_duration.html" title="cpp/language/storage duration"> Storage duration specifiers</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> <a href="initialization.html" title="cpp/language/initialization"> Initialization</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="default_initialization.html" title="cpp/language/default initialization"> Default initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="value_initialization.html" title="cpp/language/value initialization"> Value initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="zero_initialization.html" title="cpp/language/zero initialization"> Zero initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="copy_initialization.html" title="cpp/language/copy initialization"> Copy initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="direct_initialization.html" title="cpp/language/direct initialization"> Direct initialization</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="aggregate_initialization.html" title="cpp/language/aggregate initialization"> Aggregate initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="list_initialization.html" title="cpp/language/list initialization"> List initialization</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="constant_initialization.html" title="cpp/language/constant initialization"> Constant initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="reference_initialization.html" title="cpp/language/reference initialization"> Reference initialization</a></td></tr>
</table></div></td></tr>
</table></div>
</div>
<div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h1"><td colspan="5"> <a href="expressions.html" title="cpp/language/expressions"> Expressions</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="value_category.html" title="cpp/language/value category"> Value categories</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="eval_order.html" title="cpp/language/eval order"> Order of evaluation</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="operators.html" title="cpp/language/operators"> Operators</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_precedence.html" title="cpp/language/operator precedence"> Operator precedence</a></td></tr>
</table></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_alternative.html" title="cpp/language/operator alternative"> Alternative representations</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> <a href="expressions.html#Literals" title="cpp/language/expressions"> Literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="bool_literal.html" title="cpp/language/bool literal"> Boolean</a> - <a href="integer_literal.html" title="cpp/language/integer literal"> Integer</a> - <a href="floating_literal.html" title="cpp/language/floating literal"> Floating-point</a></td></tr>   
<tr class="t-nv"><td colspan="5"> <a href="character_literal.html" title="cpp/language/character literal"> Character</a> - <a href="string_literal.html" title="cpp/language/string literal"> String</a> - <a href="nullptr.html" title="cpp/language/nullptr"><tt>nullptr</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr> 
<tr class="t-nv"><td colspan="5"> <a href="user_literal.html" title="cpp/language/user literal"> User-defined</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Utilities</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="attributes.html" title="cpp/language/attributes"> Attributes</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Types</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="typedef.html" title="cpp/language/typedef"> <code>typedef</code> declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="type_alias.html" title="cpp/language/type alias"> Type alias declaration</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Casts</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="implicit_cast.html" title="cpp/language/implicit conversion"> Implicit conversions</a> - <a href="explicit_cast.html" title="cpp/language/explicit cast"> Explicit conversions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static_cast.html" title="cpp/language/static cast"><tt>static_cast</tt></a> - <a href="dynamic_cast.html" title="cpp/language/dynamic cast"><tt>dynamic_cast</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="const_cast.html" title="cpp/language/const cast"><tt>const_cast</tt></a> - <a href="reinterpret_cast.html" title="cpp/language/reinterpret cast"><tt>reinterpret_cast</tt></a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Memory allocation</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="new.html" title="cpp/language/new"> <code>new</code> expression</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="delete.html" title="cpp/language/delete"> <code>delete</code> expression</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="classes.html" title="cpp/language/classes"> Classes</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class.html" title="cpp/language/class"> Class declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="initializer_list.html" title="cpp/language/constructor"> Constructors</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="this.html" title="cpp/language/this"> <code>this</code> pointer</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="access.html" title="cpp/language/access"> Access specifiers</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="friend.html" title="cpp/language/friend"> <code>friend</code> specifier</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Class-specific function properties</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="virtual.html" title="cpp/language/virtual"> Virtual function</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="override.html" title="cpp/language/override"> <code>override</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="final.html" title="cpp/language/final"> <code>final</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="explicit.html" title="cpp/language/explicit"><tt>explicit</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static.html" title="cpp/language/static"><tt>static</tt></a> </td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Special member functions</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="default_constructor.html" title="cpp/language/default constructor"> Default constructor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="copy_constructor.html" title="cpp/language/copy constructor"> Copy constructor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="move_constructor.html" title="cpp/language/move constructor"> Move constructor</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="as_operator.html" title="cpp/language/as operator" class="mw-redirect"> Copy assignment</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="move_operator.html" title="cpp/language/move operator" class="mw-redirect"> Move assignment</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="destructor.html" title="cpp/language/destructor"> Destructor</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"><a href="templates.html" title="cpp/language/templates"> Templates</a> </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class_template.html" title="cpp/language/class template"> Class template </a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function_template.html" title="cpp/language/function template"> Function template </a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="template_specialization.html" title="cpp/language/template specialization"> Template specialization</a></td></tr>   
<tr class="t-nv"><td colspan="5"> <a href="parameter_pack.html" title="cpp/language/parameter pack"> Parameter packs</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Miscellaneous </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="asm.html" title="cpp/language/asm"> Inline assembly</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="history.html" title="cpp/language/history"> History of C++</a></td></tr>
</table></div></td></tr>
</table></div>
</div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="declarations.html" title="cpp/language/declarations"> Declarations</a><div class="t-navbar-menu"><div><div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h2"><td colspan="5"> Overview </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html" title="cpp/language/declarations"> declaration syntax</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html#Specifiers" title="cpp/language/declarations"> decl-specifier-seq</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html#Declarators" title="cpp/language/declarations"> declarator</a> </td></tr>
<tr class="t-nv-h2"><td colspan="5"> Specifiers </td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="typedef.html" title="cpp/language/typedef"><span class="t-lines"><span>typedef</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="inline.html" title="cpp/language/inline"><span class="t-lines"><span>inline</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="virtual.html" title="cpp/language/virtual"> <code>virtual</code> function specifier</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="explicit.html" title="cpp/language/explicit"> <code>explicit</code> function specifier</a>   </td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="friend.html" title="cpp/language/friend"><span class="t-lines"><span>friend</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="constexpr.html" title="cpp/language/constexpr"><span class="t-lines"><span>constexpr</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="consteval.html" title="cpp/language/consteval"><span class="t-lines"><span>consteval</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="constinit.html" title="cpp/language/constinit"><span class="t-lines"><span>constinit</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="storage_duration.html" title="cpp/language/storage duration"> storage class specifiers</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="tu_local.html" title="cpp/language/tu local"> translation-unit-local</a> <span class="t-mark-rev t-since-cxx20">(C++20)</span></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="class.html" title="cpp/language/class"><span class="t-lines"><span>class/struct</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="union.html" title="cpp/language/union"><span class="t-lines"><span>union</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><strong class="selflink"><span class="t-lines"><span>enum</span></span></strong></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="decltype.html" title="cpp/language/decltype"><span class="t-lines"><span>decltype</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="auto.html" title="cpp/language/auto"><span class="t-lines"><span>auto</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="alignas.html" title="cpp/language/alignas"><span class="t-lines"><span>alignas</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="cv.html" title="cpp/language/cv"><span class="t-lines"><span>const</span><span>volatile</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="elaborated_type_specifier.html" title="cpp/language/elaborated type specifier"> elaborated type specifier</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="attributes.html" title="cpp/language/attributes"> attributes </a><span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h2"><td colspan="5"> Declarators </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="reference.html" title="cpp/language/reference"> reference </a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="pointer.html" title="cpp/language/pointer"> pointer </a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="array.html" title="cpp/language/array"> array </a> </td></tr>
<tr class="t-nv-h2"><td colspan="5"> Block declarations </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html" title="cpp/language/declarations"> simple-declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> →<a href="structured_binding.html" title="cpp/language/structured binding"> structured binding declaration</a> <span class="t-mark-rev t-since-cxx17">(C++17)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="type_alias.html" title="cpp/language/type alias"> <code>alias</code> declaration</a><span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="namespace_alias.html" title="cpp/language/namespace alias"> namespace alias definition </a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="using_declaration.html" title="cpp/language/using declaration"> using-declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="namespace.html#Using-directives" title="cpp/language/namespace"> using-directive</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static_assert.html" title="cpp/language/static assert"> <code>static_assert</code> declaration</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="asm.html" title="cpp/language/asm"> asm-declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> opaque enum declaration</strong><span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv-h2"><td colspan="5"> Other declarations </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="namespace.html" title="cpp/language/namespace"> namespace definition</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function.html" title="cpp/language/function"> function declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="class_template.html" title="cpp/language/class template"> class template declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function_template.html" title="cpp/language/function template"> function template declaration</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="class_template.html#Explicit_instantiation" title="cpp/language/class template"> explicit template instantiation</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="template_specialization.html" title="cpp/language/template specialization"> explicit template specialization</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="language_linkage.html" title="cpp/language/language linkage"> linkage specification</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html" title="cpp/language/declarations"> attribute declaration</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="declarations.html" title="cpp/language/declarations"> empty declaration</a> </td></tr>
</table></div></td></tr>
</table></div>
</div><div></div></div></div></div><div class="t-navbar-sep"> </div></div>
<p>An <i>enumeration</i> is a distinct type whose value is restricted to a range of values (see below for details), which may include several explicitly named constants ("<i>enumerators</i>"). The values of the constants are values of an integral type known as the <i>underlying type</i> of the enumeration.
</p><p>An enumeration is (re)declared using the following syntax:
</p>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">enum-key</span> <span class="t-spar">attr</span><span class="t-mark">(optional)</span> <span class="t-spar">enum-head-name</span><span class="t-mark">(optional)</span> <span class="t-spar">enum-base</span><span class="t-mark">(optional)</span><br><code><b>{</b></code> <span class="t-spar">enumerator-list</span><span class="t-mark">(optional)</span> <code><b>}</b></code>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">enum-key</span> <span class="t-spar">attr</span><span class="t-mark">(optional)</span> <span class="t-spar">enum-head-name</span><span class="t-mark">(optional)</span> <span class="t-spar">enum-base</span><span class="t-mark">(optional)</span><br><code><b>{</b></code> <span class="t-spar">enumerator-list</span> <code><b>, }</b></code>
</td>
<td> (2)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">enum-key</span> <span class="t-spar">attr</span><span class="t-mark">(optional)</span> <span class="t-spar">enum-head-name</span> <span class="t-spar">enum-base</span><span class="t-mark">(optional)</span> <code><b>;</b></code>
</td>
<td> (3)
</td>
<td> <span class="t-mark-rev t-since-cxx11">(since C++11)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<div class="t-li1"><span class="t-li">1)</span> <i>enum-specifier</i>, which appears in <span class="t-spar">decl-specifier-seq</span> of the <a href="declarations.html" title="cpp/language/declarations">declaration</a> syntax: defines the enumeration type and its enumerators.</div>
<div class="t-li1"><span class="t-li">2)</span> A trailing comma can follow the <span class="t-spar">enumerator-list</span>.</div>
<div class="t-li1"><span class="t-li">3)</span> <i>Opaque enum declaration</i>: defines the enumeration type but not its enumerators: after this declaration, the type is a complete type and its size is known.</div>
<table class="t-par-begin">


<tr class="t-par">
<td> <span class="t-spar">enum-key</span>
</td>
<td> -
</td>
<td>
 <table class="t-rev-begin">
<tr class="t-rev t-until-cxx11"><td>
<p><code><b>enum</b></code>
</p>
</td>
<td><span class="t-mark-rev t-until-cxx11">(until C++11)</span></td></tr>
<tr class="t-rev t-since-cxx11"><td>
<p>one of <code><b>enum</b></code>, <code><b>enum class</b></code>, or <code><b>enum struct</b></code>
</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">attr</span>
</td>
<td> -
</td>
<td> <span class="t-mark-rev t-since-cxx11">(since C++11)</span> optional sequence of any number of <a href="attributes.html" title="cpp/language/attributes">attributes</a>
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">enum-head-name</span>
</td>
<td> -
</td>
<td>
 <table class="t-rev-begin">
<tr class="t-rev t-until-cxx11"><td>
<p>the name of the enumeration that's being declared, it can be omitted.
</p>
</td>
<td><span class="t-mark-rev t-until-cxx11">(until C++11)</span></td></tr>
<tr class="t-rev t-since-cxx11"><td>
<p>the name of the enumeration that's being declared, optionally preceded by a <span class="t-spar">nested-name-specifier</span>: sequence of names and scope-resolution operators <code>::</code>, ending with scope-resolution operator. It can only be omitted in unscoped non-opaque enumeration declarations.<br>
<span class="t-spar">nested-name-specifier</span> may only appear if the enumeration name is present and this declaration is a redeclaration. For opaque enumeration declarations, <span class="t-spar">nested-name-specifier</span> can only appear before the name of the enumeration in <a href="template_specialization.html" title="cpp/language/template specialization">explicit specialization declarations</a>.<br>
If <span class="t-spar">nested-name-specifier</span> is present, the <i>enum-specifier</i> cannot refer to an enumeration  merely inherited or introduced by a <a href="using_declaration.html" title="cpp/language/using declaration">using-declaration</a>, and the <i>enum-specifier</i> can only appear in a namespace enclosing the previous declaration. In such cases, <span class="t-spar">nested-name-specifier</span> cannot begin with a <a href="decltype.html" title="cpp/language/decltype">decltype</a> specifier.
</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">enum-base</span>
</td>
<td> -
</td>
<td> <span class="t-mark-rev t-since-cxx11">(since C++11)</span> colon (<code><b>:</b></code>), followed by a <span class="t-spar">type-specifier-seq</span> that names an integral type (if it is cv-qualified, qualifications are ignored) that will serve as the fixed underlying type for this enumeration type
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">enumerator-list</span>
</td>
<td> -
</td>
<td> comma-separated list of enumerator definitions, each of which is either simply an <span class="t-spar">identifier</span>, which becomes the name of the enumerator, or an identifier with an initializer: <span class="t-spar">identifier</span> <code><b>=</b></code> <span class="t-spar">constexpr</span>. <span class="t-rev-inl t-since-cxx17"><span>In either case, the <span class="t-spar">identifier</span> can be directly followed by an optional <a href="attributes.html" title="cpp/language/attributes">attribute specifier sequence</a>.</span> <span><span class="t-mark-rev t-since-cxx17">(since C++17)</span></span></span>
</td></tr></table>
<p>There are two distinct kinds of enumerations: <i>unscoped enumeration</i> (declared with the <span class="t-spar">enum-key</span> <code><b>enum</b></code>) and <i>scoped enumeration</i> (declared with the <span class="t-spar">enum-key</span> <code><b>enum class</b></code> or <code><b>enum struct</b></code>).
</p>
<h3><span class="mw-headline" id="Unscoped_enumerations">Unscoped enumerations</span></h3>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <span class="t-spar">name</span><span class="t-mark">(optional)</span> <code><b>{</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> ... <code><b>}</b></code>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <span class="t-spar">name</span><span class="t-mark">(optional)</span> <code><b>:</b></code> <span class="t-spar">type</span> <code><b>{</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> ... <code><b>}</b></code>
</td>
<td> (2)
</td>
<td> <span class="t-mark-rev t-since-cxx11">(since C++11)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <span class="t-spar">name</span> <code><b>:</b></code> <span class="t-spar">type</span> <code><b>;</b></code>
</td>
<td> (3)
</td>
<td> <span class="t-mark-rev t-since-cxx11">(since C++11)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<div class="t-li1"><span class="t-li">1)</span> Declares an unscoped enumeration type whose underlying type is not fixed (in this case, the underlying type is an implementation-defined integral type that can represent all enumerator values; this type is not larger than <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> unless the value of an enumerator cannot fit in an <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> or <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span>. If the <span class="t-spar">enumerator-list</span> is empty, the underlying type is as if the enumeration had a single enumerator with value 0. If no integral type can represent all the enumerator values, the enumeration is ill-formed).</div>
<div class="t-li1"><span class="t-li">2)</span> Declares an unscoped enumeration type whose underlying type is fixed.</div>
<div class="t-li1"><span class="t-li">3)</span> Opaque enum declaration for an unscoped enumeration must specify the name and the underlying type.</div>
<p>Each <span class="t-spar">enumerator</span> becomes a named constant of the enumeration's type (that is, <span class="t-spar">name</span>), visible in the enclosing scope, and can be used whenever constants are required.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> Color <span class="br0">{</span> red, green, blue <span class="br0">}</span><span class="sy4">;</span>
Color r <span class="sy1">=</span> red<span class="sy4">;</span>
 
<span class="kw1">switch</span><span class="br0">(</span>r<span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">case</span> red  <span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"red<span class="es1">\n</span>"</span><span class="sy4">;</span>   <span class="kw1">break</span><span class="sy4">;</span>
    <span class="kw1">case</span> green<span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"green<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
    <span class="kw1">case</span> blue <span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"blue<span class="es1">\n</span>"</span><span class="sy4">;</span>  <span class="kw1">break</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div></div>
<p>Each enumerator is associated with a value of the underlying type. When initializers are provided in the <span class="t-spar">enumerator-list</span>, the values of enumerators are defined by those initializers. If the first enumerator does not have an initializer, the associated value is zero. For any other enumerator whose definition does not have an initializer, the associated value is the value of the previous enumerator plus one.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> Foo <span class="br0">{</span> a, b, c <span class="sy1">=</span> <span class="nu0">10</span>, d, e <span class="sy1">=</span> <span class="nu0">1</span>, f, g <span class="sy1">=</span> f <span class="sy2">+</span> c <span class="br0">}</span><span class="sy4">;</span>
<span class="co1">//a = 0, b = 1, c = 10, d = 11, e = 1, f = 2, g = 12</span></pre></div></div>
<p>Values of unscoped enumeration type are <a href="implicit_cast.html#Integral_promotion" title="cpp/language/implicit conversion">implicitly-convertible</a> to integral types. If the underlying type is not fixed, the value is convertible to the first type from the following list able to hold their entire value range: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span></span></span>, <span class="t-rev-inl t-since-cxx11"><span><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span></span></span>, or <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span></span></span>, extended integer types with higher conversion rank (in rank order, signed given preference over unsigned)</span> <span><span class="t-mark-rev t-since-cxx11">(since C++11)</span></span></span>. If the underlying type is fixed, the values can be converted to their underlying type (preferred in <a href="overload_resolution.html" title="cpp/language/overload resolution">overload resolution</a>), which can then be <a href="implicit_cast.html#Integral_promotion" title="cpp/language/implicit conversion">promoted</a>.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> color <span class="br0">{</span> red, yellow, green <span class="sy1">=</span> <span class="nu0">20</span>, blue <span class="br0">}</span><span class="sy4">;</span>
color col <span class="sy1">=</span> red<span class="sy4">;</span>
<span class="kw4">int</span> n <span class="sy1">=</span> blue<span class="sy4">;</span> <span class="co1">// n == 21</span></pre></div></div>
<p>Values of integer, floating-point, and enumeration types can be converted by <a href="static_cast.html" title="cpp/language/static cast"><code>static_cast</code></a> or <a href="explicit_cast.html" title="cpp/language/explicit cast">explicit cast</a>, to any enumeration type. If the underlying type is not fixed and the source value is out of range, the behavior is undefined. (The source value, as converted to the enumeration's underlying type if floating-point, is in range if it would fit in the smallest bit field large enough to hold all enumerators of the target enumeration.) Otherwise, the result is the same as the result of <a href="implicit_cast.html" title="cpp/language/implicit conversion">implicit conversion</a> to the underlying type. 
</p><p>Note that the value after such conversion may not necessarily equal any of the named enumerators defined for the enumeration.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> access_t <span class="br0">{</span> read <span class="sy1">=</span> <span class="nu0">1</span>, write <span class="sy1">=</span> <span class="nu0">2</span>, exec <span class="sy1">=</span> <span class="nu0">4</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// enumerators: 1, 2, 4 range: 0..7</span>
access_t rwe <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span>access_t<span class="sy1">&gt;</span><span class="br0">(</span><span class="nu0">7</span><span class="br0">)</span><span class="sy4">;</span>
<a href="../error/assert.html"><span class="kw775">assert</span></a><span class="br0">(</span><span class="br0">(</span>rwe <span class="sy3">&amp;</span> read<span class="br0">)</span> <span class="sy3">&amp;&amp;</span> <span class="br0">(</span>rwe <span class="sy3">&amp;</span> write<span class="br0">)</span> <span class="sy3">&amp;&amp;</span> <span class="br0">(</span>rwe <span class="sy3">&amp;</span> exec<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
 
access_t x <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span>access_t<span class="sy1">&gt;</span><span class="br0">(</span><span class="nu16">8.0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// undefined behavior since CWG1766</span>
access_t y <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span>access_t<span class="sy1">&gt;</span><span class="br0">(</span><span class="nu0">8</span><span class="br0">)</span><span class="sy4">;</span>   <span class="co1">// undefined behavior since CWG1766</span>
 
<span class="kw2">enum</span> foo <span class="br0">{</span> a <span class="sy1">=</span> <span class="nu0">0</span>, b <span class="sy1">=</span> <a href="../types/climits.html"><span class="kw409">UINT_MAX</span></a> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// range: [0, UINT_MAX]</span>
foo x <span class="sy1">=</span> foo<span class="br0">(</span><span class="sy2">-</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// undefined behavior since CWG1766,</span>
                 <span class="co1">// even if foo's underlying type is unsigned int</span></pre></div></div>
<p>The <span class="t-spar">name</span> of an unscoped enumeration may be omitted: such declaration only introduces the enumerators into the enclosing scope:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> <span class="br0">{</span> a, b, c <span class="sy1">=</span> <span class="nu0">0</span>, d <span class="sy1">=</span> a <span class="sy2">+</span> <span class="nu0">2</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// defines a = 0, b = 1, c = 0, d = 2</span></pre></div></div>
<p>When an unscoped enumeration is a class member, its enumerators may be accessed using class member access operators <code><b>.</b></code> and <code><b>-&gt;</b></code>:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw1">struct</span> X
<span class="br0">{</span>
    <span class="kw2">enum</span> direction <span class="br0">{</span> left <span class="sy1">=</span> <span class="st0">'l'</span>, right <span class="sy1">=</span> <span class="st0">'r'</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
X x<span class="sy4">;</span>
X<span class="sy2">*</span> p <span class="sy1">=</span> <span class="sy3">&amp;</span>x<span class="sy4">;</span>
 
<span class="kw4">int</span> a <span class="sy1">=</span> X<span class="sy4">::</span><span class="me2">direction</span><span class="sy4">::</span><span class="me2">left</span><span class="sy4">;</span> <span class="co1">// allowed only in C++11 and later</span>
<span class="kw4">int</span> b <span class="sy1">=</span> X<span class="sy4">::</span><span class="me2">left</span><span class="sy4">;</span>
<span class="kw4">int</span> c <span class="sy1">=</span> x.<span class="me1">left</span><span class="sy4">;</span>
<span class="kw4">int</span> d <span class="sy1">=</span> p<span class="sy2">-</span><span class="sy1">&gt;</span>left<span class="sy4">;</span></pre></div></div>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx11"><td>
<p>In the <a href="declarations.html#Specifiers" title="cpp/language/declarations">declaration specifiers</a> of a <a href="class.html#Member_specification" title="cpp/language/class">member declaration</a>, the sequence
</p>
<dl><dd><code><b>enum</b></code> <span class="t-spar">enum-head-name</span> <code><b>:</b></code>
</dd></dl>
<p>is always parsed as a part of enumeration declaration:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw1">struct</span> S
<span class="br0">{</span>
    <span class="kw2">enum</span> E1 <span class="sy4">:</span> <span class="kw4">int</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
    <span class="kw2">enum</span> E1 <span class="sy4">:</span> <span class="kw4">int</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// error: redeclaration of enumeration,</span>
                      <span class="co1">// NOT parsed as a zero-length bit-field of type enum E1</span>
<span class="br0">}</span><span class="sy4">;</span>
 
<span class="kw2">enum</span> E2 <span class="br0">{</span> e1 <span class="br0">}</span><span class="sy4">;</span>
 
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw2">false</span> <span class="sy4">?</span> new <span class="kw2">enum</span> E2 <span class="sy4">:</span> <span class="kw4">int</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK: 'int' is NOT parsed as the underlying type</span>
<span class="br0">}</span></pre></div></div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
<h3><span class="mw-headline" id="Scoped_enumerations">Scoped enumerations</span></h3>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx11"><td>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">name</span> <code><b>{</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> ... <code><b>}</b></code>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">name</span> <code><b>:</b></code> <span class="t-spar">type</span> <code><b>{</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> <span class="t-spar">enumerator</span> <code><b>=</b></code> <span class="t-spar">constexpr</span> <code><b>,</b></code> ... <code><b>}</b></code>
</td>
<td> (2)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">name</span> <code><b>;</b></code>
</td>
<td> (3)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">name</span> <code><b>:</b></code> <span class="t-spar">type</span> <code><b>;</b></code>
</td>
<td> (4)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<div class="t-li1"><span class="t-li">1)</span> declares a scoped enumeration type whose underlying type is <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> (the keywords <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span></span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">struct</span></span></span> are exactly equivalent)</div>
<div class="t-li1"><span class="t-li">2)</span> declares a scoped enumeration type whose underlying type is <span class="t-spar">type</span></div>
<div class="t-li1"><span class="t-li">3)</span> opaque enum declaration for a scoped enumeration whose underlying type is <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span></div>
<div class="t-li1"><span class="t-li">4)</span> opaque enum declaration for a scoped enumeration whose underlying type is <span class="t-spar">type</span></div>
<p>Each <span class="t-spar">enumerator</span> becomes a named constant of the enumeration's type (that is, <span class="t-spar">name</span>), which is contained within the scope of the enumeration, and can be accessed using scope resolution operator. There are no implicit conversions from the values of a scoped enumerator to integral types, although <a href="static_cast.html" title="cpp/language/static cast"><code>static_cast</code></a> may be used to obtain the numeric value of the enumerator.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> Color <span class="br0">{</span> red, green <span class="sy1">=</span> <span class="nu0">20</span>, blue <span class="br0">}</span><span class="sy4">;</span>
Color r <span class="sy1">=</span> Color<span class="sy4">::</span><span class="me2">blue</span><span class="sy4">;</span>
 
<span class="kw1">switch</span><span class="br0">(</span>r<span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">red</span>  <span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"red<span class="es1">\n</span>"</span><span class="sy4">;</span>   <span class="kw1">break</span><span class="sy4">;</span>
    <span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">green</span><span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"green<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
    <span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">blue</span> <span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"blue<span class="es1">\n</span>"</span><span class="sy4">;</span>  <span class="kw1">break</span><span class="sy4">;</span>
<span class="br0">}</span>
 
<span class="co1">// int n = r; // error: no implicit conversion from scoped enum to int</span>
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span>r<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK, n = 21</span></pre></div></div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
<p><span id="enum_relaxed_init_cpp17"></span>
</p>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx17"><td>
<p>An enumeration can be initialized from an integer without a cast, using <a href="list_initialization.html" title="cpp/language/list initialization">list initialization</a>, if all of the following are true:
</p>
<ul><li> the initialization is direct-list-initialization
</li><li> the initializer list has only a single element
</li><li> the enumeration is either scoped or unscoped with underlying type fixed
</li><li> the conversion is non-narrowing
</li></ul>
<p>This makes it possible to introduce new integer types (e.g. <code>SafeInt</code>) that enjoy the same existing calling conventions as their underlying integer types, even on ABIs that penalize passing/returning structures by value.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> byte <span class="sy4">:</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// byte is a new integer type; see also std::byte (C++17)</span>
byte b<span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="sy4">;</span>       <span class="co1">// OK as of C++17 (direct-list-initialization)</span>
byte c <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="sy4">;</span>     <span class="co1">// error</span>
byte d <span class="sy1">=</span> byte<span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK as of C++17; same value as b</span>
byte e<span class="br0">{</span><span class="sy2">-</span><span class="nu0">1</span><span class="br0">}</span><span class="sy4">;</span>       <span class="co1">// error</span>
 
<span class="kw1">struct</span> A <span class="br0">{</span> byte b<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
A a1 <span class="sy1">=</span> <span class="br0">{</span><span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="br0">}</span><span class="sy4">;</span>     <span class="co1">// error (copy-list-initialization of a constructor parameter)</span>
A a2 <span class="sy1">=</span> <span class="br0">{</span>byte<span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK as of C++17</span>
 
<span class="kw4">void</span> f<span class="br0">(</span>byte<span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span><span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// error (copy-list-initialization of a function parameter)</span>
 
<span class="kw2">enum</span> <span class="kw1">class</span> Handle <span class="sy4">:</span> <a href="../types/integer.html"><span class="kw128">std::<span class="me2">uint32_t</span></span></a> <span class="br0">{</span> Invalid <span class="sy1">=</span> <span class="nu0">0</span> <span class="br0">}</span><span class="sy4">;</span>
Handle h<span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK as of C++17</span></pre></div></div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(since C++17)</span></td></tr>
</table>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx20"><td>
<h3> <span class="mw-headline" id="Using-enum-declaration">Using-enum-declaration</span></h3>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>using</b></code> <code><b>enum</b></code> <span class="t-spar">nested-name-specifier</span><span class="t-mark">(optional)</span> <span class="t-spar">name</span> <code><b>;</b></code>
</td>
<td class="t-sdsc-nopad">
</td>
<td> <span class="t-mark-rev t-since-cxx20">(since C++20)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<p>where <span class="t-spar">nested-name-specifier</span><span class="t-mark">(optional)</span> <span class="t-spar">name</span> must not name a <a href="dependent_name.html#Dependent_types" title="cpp/language/dependent name">dependent type</a> and must name an enumeration type.
</p><p>A using-enum-declaration introduces the enumerator names of the named enumeration as if by a <a href="using_declaration.html" title="cpp/language/using declaration">using-declaration</a> for each enumerator. When in class scope, a using-enum-declaration adds the enumerators of the named enumeration as members to the scope, making them accessible for member lookup.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> fruit <span class="br0">{</span> orange, apple <span class="br0">}</span><span class="sy4">;</span>
 
<span class="kw1">struct</span> S
<span class="br0">{</span>
    <span class="kw1">using</span> <span class="kw2">enum</span> fruit<span class="sy4">;</span> <span class="co1">// OK: introduces orange and apple into S</span>
<span class="br0">}</span><span class="sy4">;</span>
 
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
    S s<span class="sy4">;</span>
    s.<span class="me1">orange</span><span class="sy4">;</span>  <span class="co1">// OK: names fruit::orange</span>
    S<span class="sy4">::</span><span class="me2">orange</span><span class="sy4">;</span> <span class="co1">// OK: names fruit::orange</span>
<span class="br0">}</span></pre></div></div>
<p>Two using-enum-declarations that introduce two enumerators of the same name conflict.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> fruit <span class="br0">{</span> orange, apple <span class="br0">}</span><span class="sy4">;</span>
<span class="kw2">enum</span> <span class="kw1">class</span> color <span class="br0">{</span> red, orange <span class="br0">}</span><span class="sy4">;</span>
 
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">using</span> <span class="kw2">enum</span> fruit<span class="sy4">;</span>    <span class="co1">// OK</span>
    <span class="co1">// using enum color; // error: color::orange and fruit::orange conflict</span>
<span class="br0">}</span></pre></div></div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(since C++20)</span></td></tr>
</table>
<h3><span class="mw-headline" id="Notes">Notes</span></h3>
<p>Although the conversion from an out-of-range to an enumeration without fixed underlying type is made undefined behavior by the resolution of <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1766.html">CWG issue 1766</a>, currently no compiler performs the required diagnostic for it in constant evaluation.
</p>
<h3><span class="mw-headline" id="Example">Example</span></h3>
<div class="t-example"><div class="t-example-live-link"><div class="coliru-btn coliru-btn-run-init">Run this code</div></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="cpp source-cpp"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;cstdint&gt;</span>
 
<span class="co1">// enum that takes 16 bits</span>
<span class="kw2">enum</span> smallenum<span class="sy4">:</span> <a href="../types/integer.html"><span class="kw113">std::<span class="me2">int16_t</span></span></a>
<span class="br0">{</span>
    a,
    b,
    c
<span class="br0">}</span><span class="sy4">;</span>
 
<span class="co1">// color may be red (value 0), yellow (value 1), green (value 20), or blue (value 21)</span>
<span class="kw2">enum</span> color
<span class="br0">{</span>
    red,
    yellow,
    green <span class="sy1">=</span> <span class="nu0">20</span>,
    blue
<span class="br0">}</span><span class="sy4">;</span>
 
<span class="co1">// altitude may be altitude::high or altitude::low</span>
<span class="kw2">enum</span> <span class="kw1">class</span> altitude<span class="sy4">:</span> <span class="kw4">char</span>
<span class="br0">{</span>
    high <span class="sy1">=</span> <span class="st0">'h'</span>,
    low <span class="sy1">=</span> <span class="st0">'l'</span>, <span class="co1">// trailing comma only allowed after CWG518</span>
<span class="br0">}</span><span class="sy4">;</span> 
 
<span class="co1">// the constant d is 0, the constant e is 1, the constant f is 3</span>
<span class="kw2">enum</span>
<span class="br0">{</span>
    d,
    e,
    f <span class="sy1">=</span> e <span class="sy2">+</span> <span class="nu0">2</span>
<span class="br0">}</span><span class="sy4">;</span>
 
<span class="co1">// enumeration types (both scoped and unscoped) can have overloaded operators</span>
<a href="../io/basic_ostream.html"><span class="kw1733">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="../io/basic_ostream.html"><span class="kw1733">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> os, color c<span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">switch</span><span class="br0">(</span>c<span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">case</span> red   <span class="sy4">:</span> os <span class="sy1">&lt;&lt;</span> <span class="st0">"red"</span><span class="sy4">;</span>    <span class="kw1">break</span><span class="sy4">;</span>
        <span class="kw1">case</span> yellow<span class="sy4">:</span> os <span class="sy1">&lt;&lt;</span> <span class="st0">"yellow"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
        <span class="kw1">case</span> green <span class="sy4">:</span> os <span class="sy1">&lt;&lt;</span> <span class="st0">"green"</span><span class="sy4">;</span>  <span class="kw1">break</span><span class="sy4">;</span>
        <span class="kw1">case</span> blue  <span class="sy4">:</span> os <span class="sy1">&lt;&lt;</span> <span class="st0">"blue"</span><span class="sy4">;</span>   <span class="kw1">break</span><span class="sy4">;</span>
        <span class="kw1">default</span>    <span class="sy4">:</span> os.<span class="me1">setstate</span><span class="br0">(</span><a href="../io/ios_base/iostate.html"><span class="kw1704">std::<span class="me2">ios_base</span><span class="sy4">::</span><span class="me2">failbit</span></span></a><span class="br0">)</span><span class="sy4">;</span>
    <span class="br0">}</span>
    <span class="kw1">return</span> os<span class="sy4">;</span>
<span class="br0">}</span>
 
<a href="../io/basic_ostream.html"><span class="kw1733">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="../io/basic_ostream.html"><span class="kw1733">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> os, altitude al<span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">return</span> os <span class="sy1">&lt;&lt;</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy1">&gt;</span><span class="br0">(</span>al<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
 
<span class="co1">// The scoped enum (C++11) can be partially emulated in earlier C++ revisions:</span>
 
<span class="kw2">enum</span> <span class="kw1">struct</span> E11 <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// since C++11</span>
 
<span class="kw1">struct</span> E98 <span class="br0">{</span> <span class="kw2">enum</span> <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK in pre-C++11</span>
 
<span class="kw1">namespace</span> N98 <span class="br0">{</span> <span class="kw2">enum</span> <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// OK in pre-C++11</span>
 
<span class="kw1">struct</span> S98 <span class="br0">{</span> <span class="kw4">static</span> <span class="kw4">const</span> <span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">0</span>, y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK in pre-C++11</span>
 
<span class="kw4">void</span> emu<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
    <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="br0">(</span><span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span>E11<span class="sy4">::</span><span class="me2">y</span><span class="br0">)</span> <span class="sy2">+</span> E98<span class="sy4">::</span><span class="me2">y</span> <span class="sy2">+</span> N98<span class="sy4">::</span><span class="me2">y</span> <span class="sy2">+</span> S98<span class="sy4">::</span><span class="me2">y</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 4</span>
<span class="br0">}</span>
 
<span class="kw1">namespace</span> cxx20
<span class="br0">{</span>
    <span class="kw2">enum</span> <span class="kw1">class</span> long_long_long_name <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span>
 
    <span class="kw4">void</span> using_enum_demo<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"C++20 `using enum`: __cpp_using_enum == "</span><span class="sy4">;</span>
        <span class="kw1">switch</span> <span class="br0">(</span><span class="kw4">auto</span> rnd <span class="sy1">=</span> <span class="br0">[</span><span class="br0">]</span><span class="br0">{</span><span class="kw1">return</span> long_long_long_name<span class="sy4">::</span><span class="me2">x</span><span class="sy4">;</span><span class="br0">}</span><span class="sy4">;</span> rnd<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
<span class="co2">#if defined(__cpp_using_enum)</span>
            <span class="kw1">using</span> <span class="kw2">enum</span> long_long_long_name<span class="sy4">;</span>
            <span class="kw1">case</span> x<span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> __cpp_using_enum <span class="sy1">&lt;&lt;</span> <span class="st0">"; x<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
            <span class="kw1">case</span> y<span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> __cpp_using_enum <span class="sy1">&lt;&lt;</span> <span class="st0">"; y<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
<span class="co2">#else</span>
            <span class="kw1">case</span> long_long_long_name<span class="sy4">::</span><span class="me2">x</span><span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"?; x<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
            <span class="kw1">case</span> long_long_long_name<span class="sy4">::</span><span class="me2">y</span><span class="sy4">:</span> <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"?; y<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
<span class="co2">#endif</span>
        <span class="br0">}</span>
    <span class="br0">}</span>
<span class="br0">}</span>
 
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
    color col <span class="sy1">=</span> red<span class="sy4">;</span>
    altitude a<span class="sy4">;</span>
    a <span class="sy1">=</span> altitude<span class="sy4">::</span><span class="me2">low</span><span class="sy4">;</span>
 
    <a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">"col = "</span> <span class="sy1">&lt;&lt;</span> col <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span>
              <span class="sy1">&lt;&lt;</span> <span class="st0">"a = "</span>   <span class="sy1">&lt;&lt;</span> a   <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span>
              <span class="sy1">&lt;&lt;</span> <span class="st0">"f = "</span>   <span class="sy1">&lt;&lt;</span> f   <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
 
    cxx20<span class="sy4">::</span><span class="me2">using_enum_demo</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div></div>
<p>Possible output:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="text source-text"><pre class="de1">col = red
a = l
f = 3
C++20 `using enum`: __cpp_using_enum == 201907; x</pre></div></div> 
</div>
<h3><span class="mw-headline" id="Defect_reports">Defect reports</span></h3>
<p>The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
</p>
<table class="dsctable" style="font-size:0.8em">
<tr>
<th> DR
</th>
<th> Applied to
</th>
<th> Behavior as published
</th>
<th> Correct behavior
</th></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/377.html">CWG 377</a>
</td>
<td> C++98
</td>
<td> the behavior was unspecified when no integral<br>type can represent all the enumerator values
</td>
<td> the enumeration is ill-<br>formed in this case
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/518.html">CWG 518</a>
</td>
<td> C++98
</td>
<td> a trailing comma was not allowed after the enumerator list
</td>
<td> allowed
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1514.html">CWG 1514</a>
</td>
<td> C++11
</td>
<td> an redefinition of enumeration with fixed underlying type<br>could be parsed as a bit-field in a class member declaration
</td>
<td> always parsed as a redefinition
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1638.html">CWG 1638</a>
</td>
<td> C++11
</td>
<td> grammar of opaque enumeration declaration<br>prohibited use for template specializations
</td>
<td> nested-name-specifier<br>permitted
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1766.html">CWG 1766</a>
</td>
<td> C++98
</td>
<td> casting an out-of-range value to an enumeration<br>without fixed underlying type had an unspecified result
</td>
<td> the behavior is undefined
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1966.html">CWG 1966</a>
</td>
<td> C++11
</td>
<td> the resolution of <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1514.html">CWG issue 1514</a> made the <code>:</code><br>of a conditional expression part of <span class="t-spar">enum-base</span>
</td>
<td> only apply the resolution to<br>member declaration specifiers
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/2156.html">CWG 2156</a>
</td>
<td> C++11
</td>
<td> enum definitions could define<br>enumeration types by using-declarations
</td>
<td> prohibited
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/2157.html">CWG 2157</a>
</td>
<td> C++11
</td>
<td> the resolution of <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1966.html">CWG issue 1966</a> did<br>not cover qualified enumeration names
</td>
<td> covered
</td></tr></table>
<h3><span class="mw-headline" id="See_also">See also</span></h3>
<table class="t-dsc-begin">

<tr class="t-dsc">
<td>  <div class="t-dsc-member-div"><div><a href="../types/is_enum.html" title="cpp/types/is enum"> <span class="t-lines"><span>is_enum</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div>
</td>
<td>   checks if a type is an enumeration type  <br> <span class="t-mark">(class template)</span> </td></tr>

<tr class="t-dsc">
<td>  <div class="t-dsc-member-div"><div><a href="../types/is_scoped_enum.html" title="cpp/types/is scoped enum"> <span class="t-lines"><span>is_scoped_enum</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx23">(C++23)</span></span></span></div></div>
</td>
<td>   checks if a type is a scoped enumeration type  <br> <span class="t-mark">(class template)</span> </td></tr>

<tr class="t-dsc">
<td>  <div class="t-dsc-member-div"><div><a href="../types/underlying_type.html" title="cpp/types/underlying type"> <span class="t-lines"><span>underlying_type</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div></div>
</td>
<td>   obtains the underlying integer type for a given enumeration type  <br> <span class="t-mark">(class template)</span> </td></tr>

<tr class="t-dsc">
<td>  <div class="t-dsc-member-div"><div><a href="../utility/to_underlying.html" title="cpp/utility/to underlying"> <span class="t-lines"><span>to_underlying</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx23">(C++23)</span></span></span></div></div>
</td>
<td>   converts an enumeration to its underlying type <br> <span class="t-mark">(function template)</span> </td></tr>

</table>

<!-- 
NewPP limit report
Preprocessor visited node count: 6795/1000000
Preprocessor generated node count: 15336/1000000
Post‐expand include size: 226609/2097152 bytes
Template argument size: 59279/2097152 bytes
Highest expansion depth: 20/40
Expensive parser function count: 0/100
-->

<!-- Saved in parser cache with key mwiki1-mwiki_en_:pcache:idhash:4564-0!*!0!!en!*!* and timestamp 20220625162448 -->
</div>                    <!-- /bodycontent -->
                                        <!-- printfooter -->
                    <div class="printfooter">
                    Retrieved from "<a href="https://en.cppreference.com/mwiki/index.php?title=cpp/language/enum&amp;oldid=140599">https://en.cppreference.com/mwiki/index.php?title=cpp/language/enum&amp;oldid=140599</a>"                    </div>
                    <!-- /printfooter -->
                                                            <!-- catlinks -->
                    <!-- /catlinks -->
                                                            <div class="visualClear"></div>
                    <!-- debughtml -->
                                        <!-- /debughtml -->
                </div>
                <!-- /bodyContent -->
            </div>
        </div>
        <!-- /content -->
        <!-- footer -->
        <div id="cpp-footer-base" class="noprint">
            <div id="footer">
                        <div id="cpp-navigation">
            <h5>Navigation</h5>
            <ul><li><a href="https://en.cppreference.com/w/cpp/language/enum">Online version</a></li><li>Offline version retrieved 2022-07-30 14:05.</li></ul></div>
                        <ul id="footer-info">
                                    <li id="footer-info-lastmod"> This page was last modified on 25 June 2022, at 09:24.</li>
                                    <li id="footer-info-viewcount">This page has been accessed 3,782,753 times.</li>
                            </ul>
                    </div>
        </div>
        <!-- /footer -->
        <script>if(window.mw){
mw.loader.state({"site":"loading","user":"missing","user.groups":"ready"});
}</script>
<script src="../../../common/skin_scripts.js"></script>
<script>if(window.mw){
mw.loader.load(["mediawiki.action.view.postEdit","mediawiki.user","mediawiki.page.ready","mediawiki.searchSuggest","mediawiki.hidpi","ext.gadget.ColiruCompiler","ext.gadget.MathJax"], null, true);
}</script>
<script src="../../../common/site_scripts.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2828341-1']);
_gaq.push(['_setDomainName', 'cppreference.com']);
_gaq.push(['_trackPageview']);
</script><!-- Served in 0.036 secs. -->
	</body>
<!-- Cached 20220625163018 -->
</html>